package com.simp.config.task;

import com.simp.utils.GroovyUtils;
import com.simp.utils.SpringContextUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.client.RestTemplate;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/**
 * 任务调度最终要执行的方法，可以是普通方法、JavaBean 、Http请求以及Groovy脚本
 * （目前只支持无参调用）
 *
 * @author pan.shun
 * @since 2022/6/8 13:33
 */
@Slf4j
class ScheduleWork {

    void doScheduleWork(TaskDefinition taskVo) {
        switch (taskVo.getType()) {
            // 普通方法
            case 1:
                executePrimaryMethod(taskVo);
                break;
            // JavaBean
            case 2:
                executeJavaBean(taskVo);
                break;
            // Groovy脚本
            case 3:
                executeGroovyScript(taskVo);
                break;
            // Http请求
            case 4:
                executeHttpClient(taskVo);
                break;
            default:
        }
    }

    /**
     * 普通方法
     */
    private void executePrimaryMethod(TaskDefinition taskVo) {
        try {
            Class<?> aClass = Class.forName(taskVo.getClassName());
            Method run = aClass.getMethod(taskVo.getMethodName());
            run.invoke(aClass.newInstance());
        } catch (ClassNotFoundException e) {
            log.error("类名:{} 不存在 {}", taskVo.getClassName(), e.getMessage());
        } catch (NoSuchMethodException e) {
            log.error("方法名：{} 不存在 {}", taskVo.getMethodName(), e.getMessage());
        } catch (Exception e) {
            log.error("执行方法失败 {}", e);
        }
    }

    /**
     * 执行Groovy脚本
     */
    private void executeGroovyScript(TaskDefinition taskVo) {
        Object[] objects = {};
        GroovyUtils.invoke(taskVo.getScript(), taskVo.getMethodName(), objects);
    }

    /**
     * 执行JavaBean
     */
    private void executeJavaBean(TaskDefinition taskVo) {
        try {
            Object beanObject = SpringContextUtils.getBean(taskVo.getBeanName());
            if (null == beanObject) {
                log.error("Bean名称：{} 不存在", taskVo.getBeanName());
                return;
            }
            Class<?> aClass = beanObject.getClass();
//            Method method = aClass.getMethod(taskVo.getMethodName(), paramsType);
            Method method = aClass.getMethod(taskVo.getMethodName());
//            return method.invoke(beanObject, paramsValue);
            method.invoke(beanObject);
        } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
            log.error("通过反射构建{}组件失败，当前方法名:{} ", taskVo.getBeanName(), taskVo.getMethodName());
        }
    }

    /**
     * 执行Http
     */
    private void executeHttpClient(TaskDefinition taskVo) {
        try {
            RestTemplate restTemplate = new RestTemplate();
            String forObject = restTemplate.getForObject(taskVo.getUrl(), String.class);
            log.info("调用成功：{}", forObject);
        } catch (Exception e) {
            log.error("调用：{} 失败 {}", taskVo.getUrl(), e);
        }
    }
}
